﻿//-------------------------------------------------------------------
//	Copyright (c) 2010-2014  Zhirnov Andrey
//	This file is part of the "UX Standard Lib" project.
//	See copyright notice in "UX_STL_Ext.h".
//-------------------------------------------------------------------
/*
	Description:
		[ru]	заменяет стандартные хедеры OpenCL

	based on code from cl.h, cl_gl.h, cl_gl_ext.h, cl_ext.h
	from http://www.khronos.org/registry/cl/
*/

#ifndef __OPENCL_H
#define __OPENCL_H

/* OPTIONS */

// use function prototypes
//#define UX_CL_PROTOTYPES

// compile as static lib
//#define UX_CL_STATIC

// create default functions,
// if called default function in debug mode you see assert with name of function
//#define UX_CL_USE_DEFAULT_FUNC

// log write mode
// 0 - not write to log
// 1 - write in get proc address errors only
//#define UX_CL_DEBUG_LOG	1

// library name
#define CL_LIBRARY_NAME	"OpenCL.dll"

#include "../../stl_core/ux_stl_core.h"

#include "cl_platform.h"


/* DEFINES */

#ifdef UX_CL_STATIC
#	define CL_API	extern
#else
# ifdef UX_CL_BUILD
#	define CL_API	extern UX_DLL_EXPORT
# else
#	define CL_API	extern UX_DLL_IMPORT
# endif
#endif

#define CL_FUN_EXPORT	CL_API

extern "C"
{

/******************************************************************************/

#ifndef UX_CL_PROTOTYPES

/* initialization */
CL_API char			CL_Init();		// 0 - success, 1 - with errors, 2 - fail
CL_API bool			CL_Delete();
CL_API const char *	CL_GetError();
CL_API void			CL_ClearErrors();

#else
	
inline CL_API char			CL_Init()			{ return 0; }
inline CL_API bool			CL_Delete()			{ return true; }
inline CL_API const char *	CL_GetError()		{ return null; }
inline CL_API void			CL_ClearErrors()	{}

#endif

/******************************************************************************/

typedef struct _cl_platform_id *    cl_platform_id;
typedef struct _cl_device_id *      cl_device_id;
typedef struct _cl_context *        cl_context;
typedef struct _cl_command_queue *  cl_command_queue;
typedef struct _cl_mem *            cl_mem;
typedef struct _cl_program *        cl_program;
typedef struct _cl_kernel *         cl_kernel;
typedef struct _cl_event *          cl_event;
typedef struct _cl_sampler *        cl_sampler;

typedef cl_uint             cl_bool;                     /* WARNING!  Unlike cl_ types in cl_platform.h, cl_bool is not guaranteed to be the same size as the bool in kernels. */ 
typedef cl_ulong            cl_bitfield;
typedef cl_bitfield         cl_device_type;
typedef cl_uint             cl_platform_info;
typedef cl_uint             cl_device_info;
typedef cl_bitfield         cl_device_fp_config;
typedef cl_uint             cl_device_mem_cache_type;
typedef cl_uint             cl_device_local_mem_type;
typedef cl_bitfield         cl_device_exec_capabilities;
typedef cl_bitfield         cl_command_queue_properties;

typedef intptr_t			cl_context_properties;
typedef cl_uint             cl_context_info;
typedef cl_uint             cl_command_queue_info;
typedef cl_uint             cl_channel_order;
typedef cl_uint             cl_channel_type;
typedef cl_bitfield         cl_mem_flags;
typedef cl_uint             cl_mem_object_type;
typedef cl_uint             cl_mem_info;
typedef cl_uint             cl_image_info;
typedef cl_uint             cl_buffer_create_type;
typedef cl_uint             cl_addressing_mode;
typedef cl_uint             cl_filter_mode;
typedef cl_uint             cl_sampler_info;
typedef cl_bitfield         cl_map_flags;
typedef cl_uint             cl_program_info;
typedef cl_uint             cl_program_build_info;
typedef cl_int              cl_build_status;
typedef cl_uint             cl_kernel_info;
typedef cl_uint             cl_kernel_work_group_info;
typedef cl_uint             cl_event_info;
typedef cl_uint             cl_command_type;
typedef cl_uint             cl_profiling_info;

typedef struct _cl_image_format {
    cl_channel_order        image_channel_order;
    cl_channel_type         image_channel_data_type;
} cl_image_format;


typedef struct _cl_buffer_region {
    size_t                  origin;
    size_t                  size;
} cl_buffer_region;

/******************************************************************************/

/* Error Codes */
#define CL_SUCCESS                                  0
#define CL_DEVICE_NOT_FOUND                         -1
#define CL_DEVICE_NOT_AVAILABLE                     -2
#define CL_COMPILER_NOT_AVAILABLE                   -3
#define CL_MEM_OBJECT_ALLOCATION_FAILURE            -4
#define CL_OUT_OF_RESOURCES                         -5
#define CL_OUT_OF_HOST_MEMORY                       -6
#define CL_PROFILING_INFO_NOT_AVAILABLE             -7
#define CL_MEM_COPY_OVERLAP                         -8
#define CL_IMAGE_FORMAT_MISMATCH                    -9
#define CL_IMAGE_FORMAT_NOT_SUPPORTED               -10
#define CL_BUILD_PROGRAM_FAILURE                    -11
#define CL_MAP_FAILURE                              -12
#define CL_MISALIGNED_SUB_BUFFER_OFFSET             -13
#define CL_EXEC_STATUS_ERROR_FOR_EVENTS_IN_WAIT_LIST -14

#define CL_INVALID_VALUE                            -30
#define CL_INVALID_DEVICE_TYPE                      -31
#define CL_INVALID_PLATFORM                         -32
#define CL_INVALID_DEVICE                           -33
#define CL_INVALID_CONTEXT                          -34
#define CL_INVALID_QUEUE_PROPERTIES                 -35
#define CL_INVALID_COMMAND_QUEUE                    -36
#define CL_INVALID_HOST_PTR                         -37
#define CL_INVALID_MEM_OBJECT                       -38
#define CL_INVALID_IMAGE_FORMAT_DESCRIPTOR          -39
#define CL_INVALID_IMAGE_SIZE                       -40
#define CL_INVALID_SAMPLER                          -41
#define CL_INVALID_BINARY                           -42
#define CL_INVALID_BUILD_OPTIONS                    -43
#define CL_INVALID_PROGRAM                          -44
#define CL_INVALID_PROGRAM_EXECUTABLE               -45
#define CL_INVALID_KERNEL_NAME                      -46
#define CL_INVALID_KERNEL_DEFINITION                -47
#define CL_INVALID_KERNEL                           -48
#define CL_INVALID_ARG_INDEX                        -49
#define CL_INVALID_ARG_VALUE                        -50
#define CL_INVALID_ARG_SIZE                         -51
#define CL_INVALID_KERNEL_ARGS                      -52
#define CL_INVALID_WORK_DIMENSION                   -53
#define CL_INVALID_WORK_GROUP_SIZE                  -54
#define CL_INVALID_WORK_ITEM_SIZE                   -55
#define CL_INVALID_GLOBAL_OFFSET                    -56
#define CL_INVALID_EVENT_WAIT_LIST                  -57
#define CL_INVALID_EVENT                            -58
#define CL_INVALID_OPERATION                        -59
#define CL_INVALID_GL_OBJECT                        -60
#define CL_INVALID_BUFFER_SIZE                      -61
#define CL_INVALID_MIP_LEVEL                        -62
#define CL_INVALID_GLOBAL_WORK_SIZE                 -63
#define CL_INVALID_PROPERTY                         -64

/* OpenCL Version */
#define CL_VERSION_1_0                              1
#define CL_VERSION_1_1                              1

/* cl_bool */
#define CL_FALSE                                    0
#define CL_TRUE                                     1

/* cl_platform_info */
#define CL_PLATFORM_PROFILE                         0x0900
#define CL_PLATFORM_VERSION                         0x0901
#define CL_PLATFORM_NAME                            0x0902
#define CL_PLATFORM_VENDOR                          0x0903
#define CL_PLATFORM_EXTENSIONS                      0x0904

/* cl_device_type - bitfield */
#define CL_DEVICE_TYPE_DEFAULT                      (1 << 0)
#define CL_DEVICE_TYPE_CPU                          (1 << 1)
#define CL_DEVICE_TYPE_GPU                          (1 << 2)
#define CL_DEVICE_TYPE_ACCELERATOR                  (1 << 3)
#define CL_DEVICE_TYPE_ALL                          0xFFFFFFFF

/* cl_device_info */
#define CL_DEVICE_TYPE                              0x1000
#define CL_DEVICE_VENDOR_ID                         0x1001
#define CL_DEVICE_MAX_COMPUTE_UNITS                 0x1002
#define CL_DEVICE_MAX_WORK_ITEM_DIMENSIONS          0x1003
#define CL_DEVICE_MAX_WORK_GROUP_SIZE               0x1004
#define CL_DEVICE_MAX_WORK_ITEM_SIZES               0x1005
#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_CHAR       0x1006
#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_SHORT      0x1007
#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_INT        0x1008
#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_LONG       0x1009
#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_FLOAT      0x100A
#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_DOUBLE     0x100B
#define CL_DEVICE_MAX_CLOCK_FREQUENCY               0x100C
#define CL_DEVICE_ADDRESS_BITS                      0x100D
#define CL_DEVICE_MAX_READ_IMAGE_ARGS               0x100E
#define CL_DEVICE_MAX_WRITE_IMAGE_ARGS              0x100F
#define CL_DEVICE_MAX_MEM_ALLOC_SIZE                0x1010
#define CL_DEVICE_IMAGE2D_MAX_WIDTH                 0x1011
#define CL_DEVICE_IMAGE2D_MAX_HEIGHT                0x1012
#define CL_DEVICE_IMAGE3D_MAX_WIDTH                 0x1013
#define CL_DEVICE_IMAGE3D_MAX_HEIGHT                0x1014
#define CL_DEVICE_IMAGE3D_MAX_DEPTH                 0x1015
#define CL_DEVICE_IMAGE_SUPPORT                     0x1016
#define CL_DEVICE_MAX_PARAMETER_SIZE                0x1017
#define CL_DEVICE_MAX_SAMPLERS                      0x1018
#define CL_DEVICE_MEM_BASE_ADDR_ALIGN               0x1019
#define CL_DEVICE_MIN_DATA_TYPE_ALIGN_SIZE          0x101A
#define CL_DEVICE_SINGLE_FP_CONFIG                  0x101B
#define CL_DEVICE_GLOBAL_MEM_CACHE_TYPE             0x101C
#define CL_DEVICE_GLOBAL_MEM_CACHELINE_SIZE         0x101D
#define CL_DEVICE_GLOBAL_MEM_CACHE_SIZE             0x101E
#define CL_DEVICE_GLOBAL_MEM_SIZE                   0x101F
#define CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE          0x1020
#define CL_DEVICE_MAX_CONSTANT_ARGS                 0x1021
#define CL_DEVICE_LOCAL_MEM_TYPE                    0x1022
#define CL_DEVICE_LOCAL_MEM_SIZE                    0x1023
#define CL_DEVICE_ERROR_CORRECTION_SUPPORT          0x1024
#define CL_DEVICE_PROFILING_TIMER_RESOLUTION        0x1025
#define CL_DEVICE_ENDIAN_LITTLE                     0x1026
#define CL_DEVICE_AVAILABLE                         0x1027
#define CL_DEVICE_COMPILER_AVAILABLE                0x1028
#define CL_DEVICE_EXECUTION_CAPABILITIES            0x1029
#define CL_DEVICE_QUEUE_PROPERTIES                  0x102A
#define CL_DEVICE_NAME                              0x102B
#define CL_DEVICE_VENDOR                            0x102C
#define CL_DRIVER_VERSION                           0x102D
#define CL_DEVICE_PROFILE                           0x102E
#define CL_DEVICE_VERSION                           0x102F
#define CL_DEVICE_EXTENSIONS                        0x1030
#define CL_DEVICE_PLATFORM                          0x1031
/* 0x1032 reserved for CL_DEVICE_DOUBLE_FP_CONFIG */
/* 0x1033 reserved for CL_DEVICE_HALF_FP_CONFIG */
#define CL_DEVICE_PREFERRED_VECTOR_WIDTH_HALF       0x1034
#define CL_DEVICE_HOST_UNIFIED_MEMORY               0x1035
#define CL_DEVICE_NATIVE_VECTOR_WIDTH_CHAR          0x1036
#define CL_DEVICE_NATIVE_VECTOR_WIDTH_SHORT         0x1037
#define CL_DEVICE_NATIVE_VECTOR_WIDTH_INT           0x1038
#define CL_DEVICE_NATIVE_VECTOR_WIDTH_LONG          0x1039
#define CL_DEVICE_NATIVE_VECTOR_WIDTH_FLOAT         0x103A
#define CL_DEVICE_NATIVE_VECTOR_WIDTH_DOUBLE        0x103B
#define CL_DEVICE_NATIVE_VECTOR_WIDTH_HALF          0x103C
#define CL_DEVICE_OPENCL_C_VERSION                  0x103D

/* cl_device_fp_config - bitfield */
#define CL_FP_DENORM                                (1 << 0)
#define CL_FP_INF_NAN                               (1 << 1)
#define CL_FP_ROUND_TO_NEAREST                      (1 << 2)
#define CL_FP_ROUND_TO_ZERO                         (1 << 3)
#define CL_FP_ROUND_TO_INF                          (1 << 4)
#define CL_FP_FMA                                   (1 << 5)
#define CL_FP_SOFT_FLOAT                            (1 << 6)

/* cl_device_mem_cache_type */
#define CL_NONE                                     0x0
#define CL_READ_ONLY_CACHE                          0x1
#define CL_READ_WRITE_CACHE                         0x2

/* cl_device_local_mem_type */
#define CL_LOCAL                                    0x1
#define CL_GLOBAL                                   0x2

/* cl_device_exec_capabilities - bitfield */
#define CL_EXEC_KERNEL                              (1 << 0)
#define CL_EXEC_NATIVE_KERNEL                       (1 << 1)

/* cl_command_queue_properties - bitfield */
#define CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE      (1 << 0)
#define CL_QUEUE_PROFILING_ENABLE                   (1 << 1)

/* cl_context_info  */
#define CL_CONTEXT_REFERENCE_COUNT                  0x1080
#define CL_CONTEXT_DEVICES                          0x1081
#define CL_CONTEXT_PROPERTIES                       0x1082
#define CL_CONTEXT_NUM_DEVICES                      0x1083

/* cl_context_info + cl_context_properties */
#define CL_CONTEXT_PLATFORM                         0x1084

/* cl_command_queue_info */
#define CL_QUEUE_CONTEXT                            0x1090
#define CL_QUEUE_DEVICE                             0x1091
#define CL_QUEUE_REFERENCE_COUNT                    0x1092
#define CL_QUEUE_PROPERTIES                         0x1093

/* cl_mem_flags - bitfield */
#define CL_MEM_READ_WRITE                           (1 << 0)
#define CL_MEM_WRITE_ONLY                           (1 << 1)
#define CL_MEM_READ_ONLY                            (1 << 2)
#define CL_MEM_USE_HOST_PTR                         (1 << 3)
#define CL_MEM_ALLOC_HOST_PTR                       (1 << 4)
#define CL_MEM_COPY_HOST_PTR                        (1 << 5)

/* cl_channel_order */
#define CL_R                                        0x10B0
#define CL_A                                        0x10B1
#define CL_RG                                       0x10B2
#define CL_RA                                       0x10B3
#define CL_RGB                                      0x10B4
#define CL_RGBA                                     0x10B5
#define CL_BGRA                                     0x10B6
#define CL_ARGB                                     0x10B7
#define CL_INTENSITY                                0x10B8
#define CL_LUMINANCE                                0x10B9
#define CL_Rx                                       0x10BA
#define CL_RGx                                      0x10BB
#define CL_RGBx                                     0x10BC

/* cl_channel_type */
#define CL_SNORM_INT8                               0x10D0
#define CL_SNORM_INT16                              0x10D1
#define CL_UNORM_INT8                               0x10D2
#define CL_UNORM_INT16                              0x10D3
#define CL_UNORM_SHORT_565                          0x10D4
#define CL_UNORM_SHORT_555                          0x10D5
#define CL_UNORM_INT_101010                         0x10D6
#define CL_SIGNED_INT8                              0x10D7
#define CL_SIGNED_INT16                             0x10D8
#define CL_SIGNED_INT32                             0x10D9
#define CL_UNSIGNED_INT8                            0x10DA
#define CL_UNSIGNED_INT16                           0x10DB
#define CL_UNSIGNED_INT32                           0x10DC
#define CL_HALF_FLOAT                               0x10DD
#define CL_FLOAT                                    0x10DE

/* cl_mem_object_type */
#define CL_MEM_OBJECT_BUFFER                        0x10F0
#define CL_MEM_OBJECT_IMAGE2D                       0x10F1
#define CL_MEM_OBJECT_IMAGE3D                       0x10F2

/* cl_mem_info */
#define CL_MEM_TYPE                                 0x1100
#define CL_MEM_FLAGS                                0x1101
#define CL_MEM_SIZE                                 0x1102
#define CL_MEM_HOST_PTR                             0x1103
#define CL_MEM_MAP_COUNT                            0x1104
#define CL_MEM_REFERENCE_COUNT                      0x1105
#define CL_MEM_CONTEXT                              0x1106
#define CL_MEM_ASSOCIATED_MEMOBJECT                 0x1107
#define CL_MEM_OFFSET                               0x1108

/* cl_image_info */
#define CL_IMAGE_FORMAT                             0x1110
#define CL_IMAGE_ELEMENT_SIZE                       0x1111
#define CL_IMAGE_ROW_PITCH                          0x1112
#define CL_IMAGE_SLICE_PITCH                        0x1113
#define CL_IMAGE_WIDTH                              0x1114
#define CL_IMAGE_HEIGHT                             0x1115
#define CL_IMAGE_DEPTH                              0x1116

/* cl_addressing_mode */
#define CL_ADDRESS_NONE                             0x1130
#define CL_ADDRESS_CLAMP_TO_EDGE                    0x1131
#define CL_ADDRESS_CLAMP                            0x1132
#define CL_ADDRESS_REPEAT                           0x1133
#define CL_ADDRESS_MIRRORED_REPEAT                  0x1134

/* cl_filter_mode */
#define CL_FILTER_NEAREST                           0x1140
#define CL_FILTER_LINEAR                            0x1141

/* cl_sampler_info */
#define CL_SAMPLER_REFERENCE_COUNT                  0x1150
#define CL_SAMPLER_CONTEXT                          0x1151
#define CL_SAMPLER_NORMALIZED_COORDS                0x1152
#define CL_SAMPLER_ADDRESSING_MODE                  0x1153
#define CL_SAMPLER_FILTER_MODE                      0x1154

/* cl_map_flags - bitfield */
#define CL_MAP_READ                                 (1 << 0)
#define CL_MAP_WRITE                                (1 << 1)

/* cl_program_info */
#define CL_PROGRAM_REFERENCE_COUNT                  0x1160
#define CL_PROGRAM_CONTEXT                          0x1161
#define CL_PROGRAM_NUM_DEVICES                      0x1162
#define CL_PROGRAM_DEVICES                          0x1163
#define CL_PROGRAM_SOURCE                           0x1164
#define CL_PROGRAM_BINARY_SIZES                     0x1165
#define CL_PROGRAM_BINARIES                         0x1166

/* cl_program_build_info */
#define CL_PROGRAM_BUILD_STATUS                     0x1181
#define CL_PROGRAM_BUILD_OPTIONS                    0x1182
#define CL_PROGRAM_BUILD_LOG                        0x1183

/* cl_build_status */
#define CL_BUILD_SUCCESS                            0
#define CL_BUILD_NONE                               -1
#define CL_BUILD_ERROR                              -2
#define CL_BUILD_IN_PROGRESS                        -3

/* cl_kernel_info */
#define CL_KERNEL_FUNCTION_NAME                     0x1190
#define CL_KERNEL_NUM_ARGS                          0x1191
#define CL_KERNEL_REFERENCE_COUNT                   0x1192
#define CL_KERNEL_CONTEXT                           0x1193
#define CL_KERNEL_PROGRAM                           0x1194

/* cl_kernel_work_group_info */
#define CL_KERNEL_WORK_GROUP_SIZE                   0x11B0
#define CL_KERNEL_COMPILE_WORK_GROUP_SIZE           0x11B1
#define CL_KERNEL_LOCAL_MEM_SIZE                    0x11B2
#define CL_KERNEL_PREFERRED_WORK_GROUP_SIZE_MULTIPLE 0x11B3
#define CL_KERNEL_PRIVATE_MEM_SIZE                  0x11B4

/* cl_event_info  */
#define CL_EVENT_COMMAND_QUEUE                      0x11D0
#define CL_EVENT_COMMAND_TYPE                       0x11D1
#define CL_EVENT_REFERENCE_COUNT                    0x11D2
#define CL_EVENT_COMMAND_EXECUTION_STATUS           0x11D3
#define CL_EVENT_CONTEXT                            0x11D4

/* cl_command_type */
#define CL_COMMAND_NDRANGE_KERNEL                   0x11F0
#define CL_COMMAND_TASK                             0x11F1
#define CL_COMMAND_NATIVE_KERNEL                    0x11F2
#define CL_COMMAND_READ_BUFFER                      0x11F3
#define CL_COMMAND_WRITE_BUFFER                     0x11F4
#define CL_COMMAND_COPY_BUFFER                      0x11F5
#define CL_COMMAND_READ_IMAGE                       0x11F6
#define CL_COMMAND_WRITE_IMAGE                      0x11F7
#define CL_COMMAND_COPY_IMAGE                       0x11F8
#define CL_COMMAND_COPY_IMAGE_TO_BUFFER             0x11F9
#define CL_COMMAND_COPY_BUFFER_TO_IMAGE             0x11FA
#define CL_COMMAND_MAP_BUFFER                       0x11FB
#define CL_COMMAND_MAP_IMAGE                        0x11FC
#define CL_COMMAND_UNMAP_MEM_OBJECT                 0x11FD
#define CL_COMMAND_MARKER                           0x11FE
#define CL_COMMAND_ACQUIRE_GL_OBJECTS               0x11FF
#define CL_COMMAND_RELEASE_GL_OBJECTS               0x1200
#define CL_COMMAND_READ_BUFFER_RECT                 0x1201
#define CL_COMMAND_WRITE_BUFFER_RECT                0x1202
#define CL_COMMAND_COPY_BUFFER_RECT                 0x1203
#define CL_COMMAND_USER                             0x1204

/* command execution status */
#define CL_COMPLETE                                 0x0
#define CL_RUNNING                                  0x1
#define CL_SUBMITTED                                0x2
#define CL_QUEUED                                   0x3
  
/* cl_buffer_create_type  */
#define CL_BUFFER_CREATE_TYPE_REGION                0x1220

/* cl_profiling_info  */
#define CL_PROFILING_COMMAND_QUEUED                 0x1280
#define CL_PROFILING_COMMAND_SUBMIT                 0x1281
#define CL_PROFILING_COMMAND_START                  0x1282
#define CL_PROFILING_COMMAND_END                    0x1283



/********************************************************************************************************/

/* cl_gl */
typedef cl_uint     cl_gl_object_type;
typedef cl_uint     cl_gl_texture_info;
typedef cl_uint     cl_gl_platform_info;
typedef struct __GLsync *cl_GLsync;

/* cl_gl_object_type */
#define CL_GL_OBJECT_BUFFER             0x2000
#define CL_GL_OBJECT_TEXTURE2D          0x2001
#define CL_GL_OBJECT_TEXTURE3D          0x2002
#define CL_GL_OBJECT_RENDERBUFFER       0x2003

/* cl_gl_texture_info */
#define CL_GL_TEXTURE_TARGET            0x2004
#define CL_GL_MIPMAP_LEVEL              0x2005


/* cl_khr_gl_sharing extension  */

#define cl_khr_gl_sharing 1

typedef cl_uint     cl_gl_context_info;

/* Additional Error Codes  */
#define CL_INVALID_GL_SHAREGROUP_REFERENCE_KHR  -1000

/* cl_gl_context_info  */
#define CL_CURRENT_DEVICE_FOR_GL_CONTEXT_KHR    0x2006
#define CL_DEVICES_FOR_GL_CONTEXT_KHR           0x2007

/* Additional cl_context_properties  */
#define CL_GL_CONTEXT_KHR                       0x2008
#define CL_EGL_DISPLAY_KHR                      0x2009
#define CL_GLX_DISPLAY_KHR                      0x200A
#define CL_WGL_HDC_KHR                          0x200B
#define CL_CGL_SHAREGROUP_KHR                   0x200C

/* 
 *  cl_khr_gl_event  extension
 *  See section 9.9 in the OpenCL 1.1 spec for more information
 */
#define CL_COMMAND_GL_FENCE_SYNC_OBJECT_KHR     0x200D


/********************************************************************************************************/

/* cl_khr_fp64 extension - no extension #define since it has no functions  */
#define CL_DEVICE_DOUBLE_FP_CONFIG                  0x1032

/* cl_khr_fp16 extension - no extension #define since it has no functions  */
#define CL_DEVICE_HALF_FP_CONFIG                    0x1033

#define cl_APPLE_SetMemObjectDestructor 1

/************************ 
* cl_khr_icd extension *                                                  
************************/
#define cl_khr_icd 1

/* cl_platform_info                                                        */
#define CL_PLATFORM_ICD_SUFFIX_KHR                  0x0920

/* Additional Error Codes                                                  */
#define CL_PLATFORM_NOT_FOUND_KHR                   -1001


/******************************************
* cl_nv_device_attribute_query extension *
******************************************/
/* cl_nv_device_attribute_query extension - no extension #define since it has no functions */
#define CL_DEVICE_COMPUTE_CAPABILITY_MAJOR_NV       0x4000
#define CL_DEVICE_COMPUTE_CAPABILITY_MINOR_NV       0x4001
#define CL_DEVICE_REGISTERS_PER_BLOCK_NV            0x4002
#define CL_DEVICE_WARP_SIZE_NV                      0x4003
#define CL_DEVICE_GPU_OVERLAP_NV                    0x4004
#define CL_DEVICE_KERNEL_EXEC_TIMEOUT_NV            0x4005
#define CL_DEVICE_INTEGRATED_MEMORY_NV              0x4006


/*********************************
* cl_amd_device_attribute_query *
*********************************/
#define CL_DEVICE_PROFILING_TIMER_OFFSET_AMD        0x4036


#ifdef CL_VERSION_1_1
   /***********************************
    * cl_ext_device_fission extension *
    ***********************************/
    #define cl_ext_device_fission   1
    typedef cl_ulong  cl_device_partition_property_ext;

    /* cl_device_partition_property_ext */
    #define CL_DEVICE_PARTITION_EQUALLY_EXT             0x4050
    #define CL_DEVICE_PARTITION_BY_COUNTS_EXT           0x4051
    #define CL_DEVICE_PARTITION_BY_NAMES_EXT            0x4052
    #define CL_DEVICE_PARTITION_BY_AFFINITY_DOMAIN_EXT  0x4053
    
    /* clDeviceGetInfo selectors */
    #define CL_DEVICE_PARENT_DEVICE_EXT                 0x4054
    #define CL_DEVICE_PARTITION_TYPES_EXT               0x4055
    #define CL_DEVICE_AFFINITY_DOMAINS_EXT              0x4056
    #define CL_DEVICE_REFERENCE_COUNT_EXT               0x4057
    #define CL_DEVICE_PARTITION_STYLE_EXT               0x4058
    
    /* error codes */
    #define CL_DEVICE_PARTITION_FAILED_EXT              -1057
    #define CL_INVALID_PARTITION_COUNT_EXT              -1058
    #define CL_INVALID_PARTITION_NAME_EXT               -1059
    
    /* CL_AFFINITY_DOMAINs */
    #define CL_AFFINITY_DOMAIN_L1_CACHE_EXT             0x1
    #define CL_AFFINITY_DOMAIN_L2_CACHE_EXT             0x2
    #define CL_AFFINITY_DOMAIN_L3_CACHE_EXT             0x3
    #define CL_AFFINITY_DOMAIN_L4_CACHE_EXT             0x4
    #define CL_AFFINITY_DOMAIN_NUMA_EXT                 0x10
    #define CL_AFFINITY_DOMAIN_NEXT_FISSIONABLE_EXT     0x100
    
    /* cl_device_partition_property_ext list terminators */
    #define CL_PROPERTIES_LIST_END_EXT                  ((cl_device_partition_property_ext) 0)
    #define CL_PARTITION_BY_COUNTS_LIST_END_EXT         ((cl_device_partition_property_ext) 0)
    #define CL_PARTITION_BY_NAMES_LIST_END_EXT          ((cl_device_partition_property_ext) 0 - 1)

#endif /* CL_VERSION_1_1 */


/********************************************************************************************************/

#define CL_FUNCTIONS_1_0 \
	/* Platform API */ \
	CL_BUILDFUNC( cl_int, GetPlatformIDs, (cl_uint num_entries, cl_platform_id * platforms, cl_uint * num_platforms), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetPlatformInfo, (cl_platform_id platform, cl_platform_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	/* Device APIs */ \
	CL_BUILDFUNC( cl_int, GetDeviceIDs, (cl_platform_id platform, cl_device_type device_type, cl_uint num_entries, cl_device_id * devices, cl_uint * num_devices), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetDeviceInfo, (cl_device_id device, cl_device_info param_name, size_t param_value_size, void * param_value, size_t * param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	/* Context APIs  */ \
	CL_BUILDFUNC( cl_context, CreateContext, (const cl_context_properties * properties, cl_uint num_devices, const cl_device_id * devices, void (CL_CALLBACK * pfn_notify)(const char *, const void *, size_t, void *), void *user_data, cl_int * errcode_ret), null ) \
	CL_BUILDFUNC( cl_context, CreateContextFromType, (const cl_context_properties * properties, cl_device_type device_type, void (CL_CALLBACK *pfn_notify)(const char *, const void *, size_t, void *), void * user_data, cl_int * errcode_re), null ) \
	CL_BUILDFUNC( cl_int, RetainContext, (cl_context context), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, ReleaseContext, (cl_context context), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetContextInfo, (cl_context context, cl_context_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	/* Command Queue APIs */ \
	CL_BUILDFUNC( cl_command_queue, CreateCommandQueue, (cl_context context, cl_device_id device, cl_command_queue_properties properties, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_int, RetainCommandQueue, (cl_command_queue command_queue), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, ReleaseCommandQueue, (cl_command_queue command_queue), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetCommandQueueInfo, (cl_command_queue command_queue, cl_command_queue_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_mem, CreateBuffer, (cl_context context, cl_mem_flags flags, size_t size, void *host_ptr, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_mem, CreateImage2D, (cl_context context, cl_mem_flags flags, const cl_image_format *image_format, size_t image_width, size_t image_height, size_t image_row_pitch, void *host_ptr, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_mem, CreateImage3D, (cl_context context, cl_mem_flags flags, const cl_image_format *image_format, size_t image_width, size_t image_height, size_t image_depth, size_t image_row_pitch, size_t image_slice_pitch, void *host_ptr, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_int, RetainMemObject, (cl_mem memobj), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, ReleaseMemObject, (cl_mem memobj), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetSupportedImageFormats, (cl_context context, cl_mem_flags flags, cl_mem_object_type image_type, cl_uint num_entries, cl_image_format *image_formats, cl_uint *num_image_formats), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetMemObjectInfo, (cl_mem memobj, cl_mem_info param_name, size_t param_value_size, void * param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetImageInfo, (cl_mem image, cl_image_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, SetMemObjectDestructorCallback, (cl_mem memobj, void (CL_CALLBACK *pfn_notify)(cl_mem memobj, void *user_data), void *user_data), CL_DEVICE_NOT_FOUND ) \
	/* Sampler APIs  */ \
	CL_BUILDFUNC( cl_sampler, CreateSampler, (cl_context context, cl_bool normalized_coords, cl_addressing_mode addressing_mode, cl_filter_mode filter_mode, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_int, RetainSampler, (cl_sampler sampler), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, ReleaseSampler, (cl_sampler sampler), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetSamplerInfo, (cl_sampler sampler, cl_sampler_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	/* Program Object APIs  */ \
	CL_BUILDFUNC( cl_program, CreateProgramWithSource, (cl_context context, cl_uint count, const char **strings, const size_t *lengths, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_program, CreateProgramWithBinary, (cl_context context, cl_uint num_devices, const cl_device_id *device_list, const size_t *lengths, const unsigned char **binaries, cl_int *binary_status, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_int, RetainProgram, (cl_program program), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, ReleaseProgram, (cl_program program), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, BuildProgram, (cl_program program, cl_uint num_devices, const cl_device_id *device_list, const char *options, void (CL_CALLBACK *pfn_notify)(cl_program program, void *user_data), void *user_data), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, UnloadCompiler, (void), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetProgramInfo, (cl_program program, cl_program_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetProgramBuildInfo, (cl_program program, cl_device_id device, cl_program_build_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	/* Kernel Object APIs */ \
	CL_BUILDFUNC( cl_kernel, CreateKernel, (cl_program program, const char *kernel_name, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_int, CreateKernelsInProgram, (cl_program program, cl_uint num_kernels, cl_kernel *kernels, cl_uint *num_kernels_ret), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, RetainKernel, (cl_kernel kernel), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, ReleaseKernel, (cl_kernel kernel), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, SetKernelArg, (cl_kernel kernel, cl_uint arg_index, size_t arg_size, const void *arg_value), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetKernelInfo, (cl_kernel kernel, cl_kernel_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetKernelWorkGroupInfo, (cl_kernel kernel, cl_device_id device, cl_kernel_work_group_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	/* Event Object APIs  */ \
	CL_BUILDFUNC( cl_int, WaitForEvents, (cl_uint num_events, const cl_event *event_list), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetEventInfo, (cl_event event, cl_event_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, RetainEvent, (cl_event event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, ReleaseEvent, (cl_event event), CL_DEVICE_NOT_FOUND ) \
	/* Profiling APIs  */ \
	CL_BUILDFUNC( cl_int, GetEventProfilingInfo, (cl_event event, cl_profiling_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	/* Flush and Finish APIs */ \
	CL_BUILDFUNC( cl_int, Flush, (cl_command_queue command_queue), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, Finish, (cl_command_queue command_queue), CL_DEVICE_NOT_FOUND ) \
	/* Enqueued Commands APIs */ \
	CL_BUILDFUNC( cl_int, EnqueueReadBuffer, (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, size_t offset, size_t cb, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueWriteBuffer, (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, size_t offset, size_t cb, const void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueCopyBuffer, (cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, size_t src_offset, size_t dst_offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueReadImage, (cl_command_queue command_queue, cl_mem image, cl_bool blocking_read, const size_t *origin, const size_t *region, size_t row_pitch, size_t slice_pitch, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueWriteImage, (cl_command_queue command_queue, cl_mem image, cl_bool blocking_write, const size_t *origin, const size_t *region, size_t input_row_pitch, size_t input_slice_pitch, const void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueCopyImage, (cl_command_queue command_queue, cl_mem src_image, cl_mem dst_image, const size_t *src_origin, const size_t *dst_origin, const size_t *region, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueCopyImageToBuffer, (cl_command_queue command_queue, cl_mem src_image, cl_mem dst_buffer, const size_t *src_origin, const size_t *region, size_t dst_offset, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueCopyBufferToImage, (cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_image, size_t src_offset, const size_t *dst_origin, const size_t *region, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( void *, EnqueueMapBuffer, (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_map, cl_map_flags map_flags, size_t offset, size_t cb, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( void *, EnqueueMapImage, (cl_command_queue command_queue, cl_mem image, cl_bool blocking_map, cl_map_flags map_flags, const size_t *origin, const size_t *region, size_t *image_row_pitch, size_t *image_slice_pitch, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_int, EnqueueUnmapMemObject, (cl_command_queue command_queue, cl_mem memobj, void *mapped_ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueNDRangeKernel, (cl_command_queue command_queue, cl_kernel kernel, cl_uint work_dim, const size_t *global_work_offset, const size_t *global_work_size, const size_t *local_work_size, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueTask, (cl_command_queue command_queue, cl_kernel kernel, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueNativeKernel, (cl_command_queue command_queue, void (*user_func)(void *), void *args, size_t cb_args, cl_uint num_mem_objects, const cl_mem *mem_list, const void **args_mem_loc, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueMarker, (cl_command_queue command_queue, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueWaitForEvents, (cl_command_queue command_queue, cl_uint num_events, const cl_event *event_list), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueBarrier, (cl_command_queue command_queue), CL_DEVICE_NOT_FOUND ) \
	/* Extension function access
	 *
	 * Returns the extension function address for the given function name,
	 * or null if a valid function can not be found.  The client must
	 * check to make sure the address is not null, before using or 
	 * calling the returned function address.
	 */ \
	CL_BUILDFUNC( void *,  GetExtensionFunctionAddress, (const char *func_name), null ) \
	/* CL GL */ \
	CL_BUILDFUNC( cl_mem, CreateFromGLBuffer, (cl_context context, cl_mem_flags flags, cl_GLuint bufobj, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_mem, CreateFromGLTexture2D, (cl_context context, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_mem, CreateFromGLTexture3D, (cl_context context, cl_mem_flags flags, cl_GLenum target, cl_GLint miplevel, cl_GLuint texture, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_mem, CreateFromGLRenderbuffer, (cl_context context, cl_mem_flags flags, cl_GLuint renderbuffer, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_int, GetGLObjectInfo, (cl_mem memobj, cl_gl_object_type *gl_object_type, cl_GLuint *gl_object_name), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetGLTextureInfo, (cl_mem memobj, cl_gl_texture_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueAcquireGLObjects, (cl_command_queue command_queue, cl_uint num_objects, const cl_mem *mem_objects, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueReleaseGLObjects, (cl_command_queue command_queue, cl_uint num_objects, const cl_mem *mem_objects, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, GetGLContextInfoKHR, (const cl_context_properties *properties, cl_gl_context_info param_name, size_t param_value_size, void *param_value, size_t *param_value_size_ret), CL_DEVICE_NOT_FOUND ) \
	/* CL EXT * \
	CL_BUILDFUNC( cl_int, SetMemObjectDestructorAPPLE, (cl_mem memobj, void (*pfn_notify)(cl_mem memobj, void *user_data), void *user_data), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( void, LogMessagesToSystemLogAPPLE, (const char *errstr, const void *private_info, size_t cb, void *user_data), void() ) \
	/* clLogMessagesToStdout sends all log messages to the file descriptor stdout * \
	CL_BUILDFUNC( void, LogMessagesToStdoutAPPLE, (const char *errstr, const void *private_info, size_t cb, void *user_data), void() ) \
	/* clLogMessagesToStderr sends all log messages to the file descriptor stderr * \
	CL_BUILDFUNC( void, LogMessagesToStderrAPPLE, (const char *errstr, const void *private_info, size_t cb, void *user_data), void() ) \
	CL_BUILDFUNC( cl_int, IcdGetPlatformIDsKHR, (cl_uint num_entries, cl_platform_id *platforms, cl_uint *num_platforms), CL_DEVICE_NOT_FOUND ) \
/******************************************************************************/ 


#define CL_FUNCTIONS_1_1 \
	CL_BUILDFUNC( cl_mem, CreateSubBuffer, (cl_mem buffer, cl_mem_flags flags, cl_buffer_create_type buffer_create_type, const void *buffer_create_info, cl_int *errcode_ret), null ) \
	/* Event Object APIs  */ \
	CL_BUILDFUNC( cl_event, CreateUserEvent, (cl_context context, cl_int *errcode_ret), null ) \
	CL_BUILDFUNC( cl_int, SetUserEventStatus, (cl_event event, cl_int execution_status), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, SetEventCallback, (cl_event event, cl_int command_exec_callback_type, void (CL_CALLBACK *pfn_notify)(cl_event, cl_int, void *), void *user_data), CL_DEVICE_NOT_FOUND ) \
	/* Enqueued Commands APIs */ \
	CL_BUILDFUNC( cl_int, EnqueueReadBufferRect, (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_read, const size_t *buffer_origin, const size_t *host_origin, const size_t *region, size_t buffer_row_pitch, \
					size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueWriteBufferRect, (cl_command_queue command_queue, cl_mem buffer, cl_bool blocking_write, const size_t *buffer_origin, const size_t *host_origin, const size_t *region, size_t buffer_row_pitch, \
					size_t buffer_slice_pitch, size_t host_row_pitch, size_t host_slice_pitch, const void *ptr, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, EnqueueCopyBufferRect, (cl_command_queue command_queue, cl_mem src_buffer, cl_mem dst_buffer, const size_t *src_origin, const size_t *dst_origin, const size_t *region, size_t src_row_pitch, \
					size_t src_slice_pitch, size_t dst_row_pitch, size_t dst_slice_pitch, cl_uint num_events_in_wait_list, const cl_event *event_wait_list, cl_event *event), CL_DEVICE_NOT_FOUND ) \
	/* CL GL EXT */ \
	CL_BUILDFUNC( cl_event, CreateEventFromGLsyncKHR, (cl_context context, cl_GLsync cl_GLsync, cl_int *errcode_ret), null ) \
	/* CL EXT */ \
	CL_BUILDFUNC( cl_int, CreateSubDevicesEXT, (cl_device_id in_device, const cl_device_partition_property_ext *properties, cl_uint num_entries, cl_device_id *out_devices, cl_uint *num_devices), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, RetainDeviceEXT, (cl_device_id device), CL_DEVICE_NOT_FOUND ) \
	CL_BUILDFUNC( cl_int, ReleaseDeviceEXT, (cl_device_id device), CL_DEVICE_NOT_FOUND ) \
/******************************************************************************/ 



	

#ifdef UX_CL_PROTOTYPES

#undef  CL_BUILDFUNC
#define CL_BUILDFUNC( _retType, _funcName, _funcParams, _retValue ) \
	extern CL_API_ENTRY _retType CL_API_CALL cl##_funcName _funcParams;

CL_FUNCTIONS_1_0
CL_FUNCTIONS_1_1

#undef  CL_BUILDFUNC
#define CL_BUILDFUNC( _retType, _funcName, _funcParams, _retValue )

#else	// not define UX_CL_PROTOTYPES



// typedefs //
#undef  CL_BUILDFUNC
#define CL_BUILDFUNC( _retType, _funcName, _funcParams, _retValue ) \
	typedef CL_API_ENTRY _retType (CL_API_CALL *cl##_funcName##_fn) _funcParams;

CL_FUNCTIONS_1_0
CL_FUNCTIONS_1_1

#undef  CL_BUILDFUNC
#define CL_BUILDFUNC( _retType, _funcName, _funcParams, _retValue )



// export functions //
#undef  CL_BUILDFUNC
#define CL_BUILDFUNC( _retType, _funcName, _funcParams, _retValue ) \
	CL_FUN_EXPORT		cl##_funcName##_fn		cl##_funcName;

CL_FUNCTIONS_1_0
CL_FUNCTIONS_1_1

#undef  CL_BUILDFUNC
#define CL_BUILDFUNC( _retType, _funcName, _funcParams, _retValue )


#endif	// CL_PROTOTYPES


}	// extern "C"

#endif  /* __OPENCL_H   */